
/*
 * 客户端 net
 * - socket 通信 
 * - 以 buffer 为请求与响应的数据类型（tcp 二进制数据流）
 * 
 * 步骤
 * - 创建 socket
 * - 连接 server
 * - 包装待发送的 buf
 * - socket.write(buf) 向服务器发送请求的 buf
 * - socker.on() 监听服务器响应的数据 buf
 * 
 * 全双工通信通道搭建
 * - 关键在于应用层协议需要有标记包号的字段，如 seq
 * - 一次性发送多个包，会被系统合并为一个包，服务端需要拆分包（称之为粘包）
 */
const net = require('net')

const socket = new net.Socket({})

socket.connect({
    host: 'localhost',
    port: 4000
})

const lessonids = [
    136797,
    136798,
    136799,
    136800,
    136801,
    136802,
    136803,
    136804,
    136805,
    136806
]

// 监听数据的返回
socket.on('data', (buffer) => {
    const seqBuffer = buffer.slice(0, 2)
    const lessonBuf = buffer.slice(2)
    // 打印收包内容
    console.log(seqBuffer.readInt16BE(), lessonBuf.toString())
})

// 每次请求添加的标识
let seq = 0
function writeEncode() {
    // 随机一个下标
    const index = Math.floor(Math.random() * lessonids.length)
    let buffer= Buffer.alloc(6)
    buffer.writeInt16BE(seq)
    buffer.writeInt32BE(lessonids[index], 2)
    // 打印发包内容
    console.log(seq, lessonids[index])
    seq++
    // 发送数据
    socket.write(buffer)
}

// 定时发包，模拟乱序发包的情况，观察 seq 是否对的上
setInterval(() => {
    writeEncode()
}, 100);